package ar.com.siavu;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import ar.com.siavu.controller.configuration.HibernateUtil;
import ar.com.siavu.controller.memory.AGSingleton;
import ar.com.siavu.domain.Actividad;
import ar.com.siavu.domain.ActividadDiaLibre;
import ar.com.siavu.domain.ActividadPosta;
import ar.com.siavu.domain.Plazo;
import ar.com.siavu.domain.Posta;
import ar.com.siavu.domain.Programacion;
import ar.com.siavu.domain.Regla;
import ar.com.siavu.domain.Usuario;
import junit.framework.TestCase;

public class GeneratePreProgramacionAuxiliaresInternacional extends TestCase {

	public void testGeneratePreProgramacionAuxiliaresInternacional(){
		Session s= HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t= s.beginTransaction();
		Criteria crit=s.createCriteria(Usuario.class);
		crit.add(Restrictions.eq("TipoUsuario", 3));
		crit.add(Restrictions.eq("TipoPosta", 2));
		List<Usuario> auxiliares= crit.list();
		
		
		Criteria critPrep= s.createCriteria(Regla.class);
		List<Regla> reglas=critPrep.list();
		AGSingleton.getInstance().setReglasPost(new HashMap<String, Integer>());
		for (Regla regla : reglas) {
			AGSingleton.getInstance().getReglasPost().put(regla.getNomenclatura(), regla.getHorasPostAterrizaje());
			
		}
		
		Criteria critPlazo= s.createCriteria(Plazo.class);
		critPlazo.add(Restrictions.eq("Anio", 2010)).add(Restrictions.eq("Mes", 9));
		List<Plazo> plazosAux= critPlazo.list();
		Plazo plazo2010_9=plazosAux.get(0);
		Criteria critPosta= s.createCriteria(Posta.class);
		critPosta.createAlias("VueloIda", "vue");
		critPosta.add(Restrictions.in("vue.Numero", new Integer[]{1182,1132,1140,1160,1302,1376,1360,1364}));
		GregorianCalendar gcInicio= new GregorianCalendar();
		gcInicio.set(2010, 9-1, 1, 0, 0);
		GregorianCalendar gcFin= new GregorianCalendar();
		gcFin.set(2010, 9-1, 30, 23, 59);
		critPosta.add(Restrictions.ge("vue.FechaSalida", gcInicio.getTime()));
		critPosta.add(Restrictions.le("vue.FechaSalida", gcFin.getTime()));
		List<Posta> postas= critPosta.list();
		
		List<Programacion> progAPersistir= new ArrayList<Programacion>();
		
		Set<Entry<String, Integer>> reglasEntry =AGSingleton.getInstance().getReglasPost().entrySet();
		for (Entry<String, Integer> entry : reglasEntry) {
			System.out.println(entry.getKey() + ": " + entry.getValue());
		}
		 
		for (Usuario auxiliar : auxiliares) {
			System.out.println(auxiliar.getNombreCompleto());
			Programacion prog= new Programacion();
			prog.setUsuario(auxiliar);
			prog.setPlazo(plazo2010_9);
			prog.setTipoProgramacion(1);
			prog.setFechasVariables((int)(Math.round((Math.random()*10))%2)==0?true:false);
			prog.setActividades(new ArrayList<Actividad>());
			int diasLibres=(int)(Math.round((Math.random()*100))%26);
			for (int i = diasLibres; i < diasLibres+4; i++) {
				ActividadDiaLibre actdl=new ActividadDiaLibre();
				GregorianCalendar dia= new GregorianCalendar();
				dia.set(2010, GregorianCalendar.SEPTEMBER, i+1, 0, 0, 01);
				actdl.setFechaInicio(dia.getTime());
				dia.set(2010, GregorianCalendar.SEPTEMBER, i+1, 23, 59, 59);
				actdl.setFechaFin(dia.getTime());
				actdl.setProgramacion(prog);
				actdl.setDescripcion("DL");
				prog.getActividades().add(actdl);
			}
			int seleccion=0;
			for(int i=0; (i<10 && seleccion<2);i++){
				int analisisPosta=(int)(Math.round((Math.random()*1000))%postas.size());
				Posta posta=postas.get(analisisPosta);
				GregorianCalendar inicio= new GregorianCalendar();
				inicio.setTime(posta.getVueloIda().getFechaSalida());
				GregorianCalendar fin= new GregorianCalendar();
				fin.setTime(posta.getVueloVuelta().getFechaLlegada());
				fin.add(GregorianCalendar.HOUR_OF_DAY, AGSingleton.getInstance().getReglasPost().get(posta.getNombre()));
				boolean ok=true;
				System.out.println("Posta " + posta.getNombre() + " " + posta.getVueloIda().getFechaSalida() + " al " + posta.getVueloVuelta().getFechaLlegada()+ " | " + fin.getTime());
				for (Actividad act : prog.getActividades()) {
					Date fechafinActividad=act.getFechaFin();
					if (act instanceof ActividadPosta){
						ActividadPosta actP= (ActividadPosta) act;
						GregorianCalendar gc= new GregorianCalendar();
						gc.setTime(fechafinActividad);
						gc.add(GregorianCalendar.HOUR_OF_DAY, AGSingleton.getInstance().getReglasPost().get(actP.getPosta().getNombre()));
						fechafinActividad= gc.getTime();
					}
					System.out.println("Actividad " + act.getDescripcion() + " desde " + act.getFechaInicio() + " al "+fechafinActividad);
					/*System.out.println("act.getFechaInicio()                 " + act.getFechaInicio());
					System.out.println("act.fechafinActividad)               " + fechafinActividad);
					System.out.println("posta.getVueloIda().getFechaSalida() " + posta.getVueloIda().getFechaSalida());
					System.out.println("posta.fin.getTime()                  " + fin.getTime());*/
					
					if (!(fin.getTime().before(act.getFechaInicio()) || posta.getVueloIda().getFechaSalida().after(fechafinActividad))){
						ok=false;
					} 
					
					if (ok && act instanceof ActividadPosta){
						System.out.println(ok);
					}
				}
				
				if (ok){
					ActividadPosta actp= new ActividadPosta();
					actp.setPosta(posta);
					actp.setDescripcion(posta.getNombre());
					actp.setFechaInicio(posta.getVueloIda().getFechaSalida());
					actp.setFechaFin(posta.getVueloVuelta().getFechaLlegada());
					actp.setProgramacion(prog);
					actp.setEstadoActividad(0);
					prog.getActividades().add(actp);
					seleccion++;
				}
			}
			progAPersistir.add(prog);
		}
		SimpleDateFormat sdf= new SimpleDateFormat("dd.MM");
		for (Programacion programacion : progAPersistir) {
			
			Collections.sort(programacion.getActividades());
			
			System.out.print(programacion.getUsuario().getNombreCompleto() + ": ");
			for (Actividad actividad : programacion.getActividades()) {
				
				System.out.print(actividad.getDescripcion() + " " + sdf.format(actividad.getFechaInicio()) + "|" + sdf.format(actividad.getFechaFin()) + "|");				
			}
			System.out.println();
			
		}
		
		
		for (Programacion programacion : progAPersistir) {
			s.save(programacion);
			for (Actividad actividad : programacion.getActividades()) {
				s.save(actividad);
			}
		}
		t.commit();
		
	}
}
